package com.blackhorse.order.controller;

import com.blackhorse.order.entity.Product;
import com.blackhorse.order.feign.ProductFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    /**
     * 注入SpringCloud提供的获取Eureka元数据的工具类
     * 调用方法获取Eureka服务端的元数据信息
     */
    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired //使用自定义的Feign客户端接口进行远程调用
    private ProductFeignClient productFeignClient;

    /**
     * 参数：商品Id
     * 通过订单服务，调用商品服务根据id查询商品信息
     * 1.需要配置商品对象
     * 2.需要远程调用商品服务
     * 1)使用JDK的URLConncetion
     * 2)使用HttpClient等第三方工具
     * 3)使用Spring的RestTemplate（推荐）
     * 3.使用RestTemplate
     * getForXXX方法表示发送get请求
     * postForXXX方法表示发送post请求
     *
     * @return Product
     */
    @GetMapping("/buy/{id}")
    public Product buyProductById(@PathVariable Long id) {
        //原来：本地服务调用
//        Product product = productService.findById(id);
        //现在：如何远程调用商品服务？
        //最原始方法：使用Spring的RestTemplate，可以远程调用HTTP接口
//        String url = "http://localhost:9001/product/" + id;//硬编码
//        Product product = restTemplate.getForObject(url, Product.class);


        //优化方法1：使用Eureka元数据拼接url，不再需要硬编码
//        //调用DiscoveryClient方法获取元数据
//        List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
//        //由于service-product只有一个，list里只有一条数据
//        ServiceInstance serviceInstance = instances.get(0);
//        //根据元数据获取主机名和端口号
//        String host = serviceInstance.getHost();
//        int port = serviceInstance.getPort();
//        String url = String.format("http://%s:%d/product/%d", host, port, id);
//        Product product = restTemplate.getForObject(url, Product.class);

        //优化方法2：使用Eureka集成的ribbon负载均衡器，只需要再创建restTemplate使用@BalancedLoad注解
//        String url = "http://service-product/product/" + id;//将url的ip:port换成微服务名称
//        Product product = restTemplate.getForObject(url, Product.class);

        //优化方法3：使用自定义FeignCilent接口
        Product product = productFeignClient.getProductByFeign(id);
        return product;
    }

    @GetMapping("/{id}")
    public String findOrderById(@PathVariable Long id){
        return "调用订单系统查询订单";
    }

}
